package BinaryTree;
//给定两个整数数组 preorder 和 inorder ，其中 preorder 是二叉树的先序遍历， inorder 是同一棵树的中序遍历，请构造二叉树并返回其根节点。
class UsePerAhdInOrderCreateTree {
    //创建一个节点：采用孩子表示法
    static class TreeNode {
        public int val;
        public TreeNode left;//储存左孩子的引用
        public TreeNode right;//储存右孩子的引用
        public TreeNode(int val) {
            this.val = val;
        }
    }
    public int preIndex;
    public TreeNode buildTree(int[] preorder, int[] inorder) {
        return buildTreeChild(preorder, inorder, 0, inorder.length - 1);
    }

    public TreeNode buildTreeChild(int[] preorder, int[] inorder, int inbegin, int inend) {
        //这个条件是已经走到没有节点了
        if(inbegin > inend) {
            return null;
        }
        //创建一个根节点
        TreeNode root = new TreeNode(preorder[preIndex]);
        //在中序遍历中找到根节点（由前序遍历的第一个可知根节点）
        int rootIndex = findVal(inorder, inbegin, inend, preorder[preIndex]);
        preIndex++;
        //找到就可以在中序遍历中以根节点 分为左子树 和右子树
        root.left = buildTreeChild(preorder, inorder, inbegin, rootIndex - 1);
        root.right = buildTreeChild(preorder, inorder, rootIndex + 1, inend);

        return root;
    }

    //在中序遍历中找到根节点（由前序遍历的第一个可知根节点）
    public int findVal(int[] inorder, int inbegin, int inend, int val) {
        for(int i = inbegin; i <= inend; i++) {
            if(val == inorder[i]) {
                return i;
            }
        }
        return -1;
    }
}